mkdir — Create Directories Linux coreutils
Directories are the “containers” that keep your server organized: web roots, logs, backups, uploads, and app configs all start with a folder structure.
mkdir (make directory) is the standard Linux command for creating those folders—reliably, script-friendly, and with useful flags for automation.
If you deploy apps (WordPress, Node, Laravel), run backups, or manage logs on a VPS, mkdir is one of the most-used commands in your toolbox.
Core Syntax
mkdir [OPTION]... DIRECTORY...
- You can create one directory or many in a single command.
OPTIONchanges behavior (parents, verbosity, mode, etc.).
Options You’ll Actually Use
| Option | Meaning | Typical Use |
|---|---|---|
| -- | - | -- |
-p | Create parent directories as needed (no error if existing) | Automation, nested paths (/a/b/c) |
-v | Verbose: print message for each created directory | Scripts / visibility |
-m MODE | Set permissions at creation time | Secure folders (e.g., 700) |
--help | Built-in help | Quick lookup |
--version | Show version | Troubleshooting consistency |
-m-m sets the directory mode, similar to running chmod right after creation—useful for secure paths like config or temp upload folders.
Common Patterns
- Single directory
- Multiple at once
- Nested structure
- Create with permissions
mkdir backups
mkdir plugins themes uploads
mkdir -p wp-content/uploads/2025/10
mkdir -m 700 private_folder
Best Practices
- Prefer
-pfor nested paths (especially in scripts). - Use
-mfor security-sensitive directories at creation time. - Use
-vin automation so logs clearly show what was created. - Avoid spaces in folder names on servers (use
my_folderinstead ofmy folder).
If a directory might already exist, mkdir -p is safer than plain mkdir—it avoids breaking deployments.
Benefits
- Fast and consistent folder creation
- Makes app structure predictable (WordPress themes/plugins/uploads)
- Helps automate backups, staging environments, and log organization
- Reduces permission mistakes by setting mode at creation time (
-m)
Troubleshooting
| Symptom | Likely Cause | Fix |
|---|---|---|
| -- | -- | |
Permission denied | You lack write permission in target directory | Use sudo, or fix ownership (chown) |
No such file or directory | Parent folders don’t exist | Add -p |
| Wrong permissions after creation | Default umask applied; -m not used | Use chmod, or recreate with -m |
File exists | Directory already exists | Use -p or choose a unique name |
Quick check commands (HTML)
# Where am I?
pwd
# Who am I?
whoami
# Do I have permission here?
ls -ld .
# Inspect the directory (ownership/permissions)
ls -ld target_dir
Cheat Sheet
mkdir backups # Create single dir
mkdir plugins themes # Multiple dirs
mkdir -p uploads/2025/10 # Nested with parents
mkdir -v staging # Verbose mode
mkdir -m 755 cache # Set permissions
Mini Quiz
- What happens if you run
mkdir wp-content/uploads/2025/10without-pand the parent folders don’t exist? - Which option prints confirmation messages for created folders?
- How do you set permissions at creation time?
- Why is
mkdir -pimportant in automation scripts?
- It fails with “No such file or directory”. 2)
-v. 3)-m MODE. 4) Because scripts shouldn’t break if parents exist or are missing.
Worked Examples (with outputs)
Examples are grouped after the explanations so you can learn the concepts first, then apply them.
Create a single directory
mkdir backups
Expected output: (silent success)
Create multiple directories at once
mkdir plugins themes uploads
Expected output: (silent success)
Create nested directories without -p (failure example)
mkdir wp-content/uploads/2025/10
Expected output:
mkdir: cannot create directory ‘wp-content/uploads/2025/10’: No such file or directory
Create nested directories with -p
mkdir -p wp-content/uploads/2025/10
Expected output: (silent success)
Verbose output
mkdir -v new_logs
Expected output:
mkdir: created directory 'new_logs'
Set permissions at creation
mkdir -m 700 private_folder
Expected output: (silent success)
Combine -p and -v
mkdir -pv /backups/mysql/2025/Oct
Expected output:
mkdir: created directory '/backups'
mkdir: created directory '/backups/mysql'
mkdir: created directory '/backups/mysql/2025'
mkdir: created directory '/backups/mysql/2025/Oct'
Create inside system directory (requires sudo)
sudo mkdir /var/log/wp-security
Expected output: (silent success)
Directory name with spaces (quotes required)
mkdir "my custom folder"
Expected output: (silent success)
Verify result
ls -ld backups
Expected output (example):
drwxr-xr-x 2 user user 4096 Oct 2 09:30 backups
Brace expansion (multiple folders fast)
mkdir {css,js,images}
Expected output: (silent success)
Nested brace expansion with parents
mkdir -p wp-content/{plugins,themes,uploads}/2025
Expected output: (silent success)
Directory named with today’s date
mkdir $(date +%Y-%m-%d)
Expected output (example directory name):
2025-10-02/
Directory with timestamp (unique backups)
mkdir backup-$(date +%Y%m%d-%H%M)
Expected output (example):
backup-20251002-0930/
Temporary directory in /tmp
mkdir /tmp/wp-test
Expected output: (silent success)
Secure uploads temp folder (WordPress)
mkdir -m 700 /var/www/html/wp-content/tmp
Expected output: (silent success)
On many servers /var/www/html is owned by www-data (or similar). You may need sudo or correct ownership depending on your setup.
Restricted path creation
sudo mkdir /etc/wp-custom
Expected output: (silent success)
Create multiple dated folders in one command
mkdir -p backups/{2024,2025}/{Jan,Feb,Mar}
Expected output: (silent success)
Create multiple project folders
mkdir project_{alpha,beta,gamma}
Expected output: (silent success)
Create and verify immediately
mkdir staging && ls -ld staging
Expected output (example):
drwxr-xr-x 2 user user 4096 Oct 2 staging
Numeric directory name
mkdir 12345
Expected output: (silent success)
Name starts with hyphen (use --)
mkdir -- -cache
Expected output: (silent success)
Create multiple user folders in /home/
sudo mkdir -p /home/{alice,bob,charlie}
Expected output: (silent success)
Dedicated Nginx/Apache logs directory
sudo mkdir -pv /var/log/nginx/wordpress
Expected output:
mkdir: created directory '/var/log/nginx'
mkdir: created directory '/var/log/nginx/wordpress'
Read-only directory (prevent writes)
mkdir -m 555 readonly_dir
Expected output: (silent success)